package com.shujia.spark.mllib

import org.apache.spark.ml.classification.{LogisticRegression, LogisticRegressionModel}
import org.apache.spark.sql.{DataFrame, Dataset, Row, SparkSession}

object Demo3Person {
  def main(args: Array[String]): Unit = {
    val spark: SparkSession = SparkSession
      .builder()
      .master("local")
      .appName("point")
      .getOrCreate()
    import spark.implicits._
    import org.apache.spark.sql.functions._

    /**
     * 1、读取svm格式的数据
     * svm是机器学习中一种存储数据的格式，由目标值和特征向量组成
     *
     */
    val personDF: DataFrame = spark
      .read
      .format("libsvm")
      .load("data/人体指标.txt")
    personDF.printSchema()

    personDF.show(false)

    /**
     * 2、将原始的数据拆分成训练数据和测试数据
     * 训练数据：用于训练模型   0.8
     * 测试数据：测试模型的准确率  0.2
     */

    val Array(train: DataFrame, test: DataFrame) = personDF.randomSplit(Array(0.8, 0.2))

    println(train.count())
    println(test.count())

    /**
     * 3、选择算法
     * 根据目标值不同分分类算法和回归算法
     *
     */

    val logisticRegression = new LogisticRegression()

    /**
     * 4、将训练数据带入算法训练模型
     */
    val model: LogisticRegressionModel = logisticRegression.fit(train)
    println(model.intercept)
    println(model.coefficients)


    /**
     * 5、将测试集带入模型测试模型的准确率
     */

    val testDF: DataFrame = model.transform(test)

    testDF.show(1000, false)

    /**
     * 6、计算准确率
     */

    val p: Double = testDF.where($"label" === $"prediction").count().toDouble / testDF.count()

    println(p)

    /**
     * 7、保存模型, 将模型保存到hdfs
     */
    model
      .write
      .overwrite()
      .save("data/person_model")


  }

}
